一篇文章带你吃透 Dockerfile

您所在的位置:网站首页 dockerfile 新增一个目录 一篇文章带你吃透 Dockerfile

一篇文章带你吃透 Dockerfile

2024-03-19 00:36| 来源: 网络整理| 查看: 265

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情

 引言

刚开始使用 Docker 时,我们直接从 Docker 的官方镜像仓库拉取镜像,然后根据这些镜像创建出容器并运行

实际上,Docker 官方镜像也是通过一定的方式构建出来的,如果能弄清楚其中的构建逻辑,我们也可以仿照官方镜像的构建过程,构建出自己想要的镜像

Dockerfile 就是这样一个用于描述 Docker 镜像构建过程的文本文件,这个文件可以包含多条构建指令,以及相关的描述

因此,在构建自定义 Docker 镜像之前,有必要先了解镜像构建的原理,以及 Dockerfile 的相关语法,才能写出高效的 Dockerfile,以便于缩短整体构建时间、减小最终镜像的大小

一、镜像构建原理 (一) Docker 架构模式回顾

如图所示,Docker 使用了 client / server 的架构模式。构建镜像时,用户在 Docker Client 输入构建命令,Docker 引擎以 REST API 的形式,向 Docker daemon 发送构建请求,然后 Docker daemon 就根据构建请求的内容,开始镜像构建的工作了,并向 Client 持续返回构建过程的信息,让用户可以看到当前的构建状态

(二) 镜像分层模型 

Docker 镜像是用于创建容器的只读模板,是通过 Dockerfile 中定义的指令构建而成的,构建结束后,会在原有的镜像层上生成一个新的镜像层,如下图所示

用 tomcat 镜像创建一个容器,会在 tomcat 镜像之上新建一个可写的容器层,在容器中写文件时,会保存到这个容器层中,如下图所示

(三) 基础镜像与父级镜像

用于构建基础镜像的 Dockerfile 不指定父级镜像,Docker 约定使用如下的形式定义基础镜像

FROM scratch

这里的 scratch 是一个空镜像,可以从零开始构建镜像,常被用来构建最小化镜像,如 busybox, debian, alpine 等镜像,省去了很多 Linux 命令,因此镜像很小。一般情况下,不需要自己构建基础镜像

构建自定义镜像时,通过 FROM 指定使用什么父级镜像。一般而言,官方的 tomcat 命令没有 yum, vim 等命令。可以将 tomcat 镜像作为父级镜像,然后安装 yum,vim 命令,然后构建自定义镜像,这样就可以在容器中直接使用这些命令了。如下图所示

(四) 构建上下文 / build context

Client 向 Docker daemon 发送的构建请求包含两部分,第一部分是最重要的 Dockerfile 文件,第二部分就是构建上下文

构建上下文是一些文件集合,这些文件可以是指定路径下的文件,也可以是远程资源中指定路径下的文件。构建过程中,Docker daemon 可以访问这些文件,并执行相应的操作

构建上下文可以分为以下 3 种情况

1. 路径上下文

构建命令中指定具体路径,该路径下的所有文件即为构建上下文,这些文件会被打包并发送到 Docker daemon 中,然后被解压

假设一个项目的文件结构如下

demo ├── Dockerfile ├── src ├── test └── node_modules

 在项目根目录执行如下构建命令

docker build -t img-tag .

构建请求的第 1 部分是 Dockerfile,这个文件在当前目录下,文件名是默认名称,因此可以省略

相当于默认加上了 -t Dockerfile,Dockerfile 内容如下

# syntax=docker/dockerfile:1 FROM busybox WORKDIR /src COPY src .

构建请求的第 2 部分是 . 这个点代表当前目录,此时当前目录就是此次的构建上下文,Docker 引擎会整理该目录下的所有文件,把不被 .dockerignore 中的规则所匹配的文件都发送到 Docker daemon 中,如下图所示

如果此时位于项目根目录的上一级目录,构建命令如下

docker build -t img-tag -f ./demo/Dockerfile ./demo/ 2. URL 上下文

Docker 还支持利用远程仓库 URL 构建镜像,此时指定的远程仓库目录就充当了构建上下文

docker build https://gitee.com:user/my-repo.git#master:docker

以上构建命令指定了一个 Gitee  项目的 master 分支,冒号(:)之前是 Git 检出的目标 URL, 冒号之后的 docker 是远程仓库根目录下的一个子目录,此时这个子目录就是构建上下文

Docker client 执行构建命令时,Docker 引擎首先会将远程仓库的 master 分支拉取到本地的一个临时目录中,然后将其中的 docker 目录下的文件作为构建上下文发送到 Docker daemon 中。拉取远程文件之后,又回到了路径上下文的步骤,如下图所示

3. 省略上下文

如果 Dockerfile 中的指令不需要对任何文件进行操作,可以省略构建上下文,此时不会向 Docker daemon 发送额外的文件,这可以提高构建速度

示例构建命令如下

docker build -t my-hello-world:latest -


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3